The use of configurable integrated circuits (“ICs”) has dramatically increased in recent years. Configurable ICs can be used to implement circuits designed by a user (“user design”) on an IC without having to fabricate a new IC for each design. One example of a configurable IC is a field programmable gate array (“FPGA”). An FPGA is a field programmable IC that usually has configurable logic and interconnect circuits that are surrounded by input/output (“I/O”) circuits.
The configurable logic circuits (also called logic blocks) are typically arranged as an internal array of circuits. A configurable logic circuit can be configured to perform a number of different functions. A configurable logic circuit typically receives a set of input data and a set of configuration data that is often stored close to the logic circuit. From the set of functions that the logic circuit can perform, the configuration data set specifies a particular function that this circuit is to perform on the input data set. Such a logic circuit is said to be configurable, as the configuration data set “configures” the logic circuit to perform a particular function.
These logic circuits are connected together through numerous configurable interconnect circuits (also called interconnects). A configurable interconnect circuit connects one or more of a set of circuit elements to another set of circuit elements based on a set of configuration data that it receives. The configuration bits specify how the interconnect circuit should connect the input data set to the output data set. The interconnect circuit is said to be configurable, as the configuration data set “configures” the interconnect circuit to use a particular connection scheme that connects the input data set to the output data set in a desired manner. In some FPGAs, the configuration data set of a configurable logic or interconnect set can be modified by writing new data in SRAM cells that store the configuration data set.
Designing a configuration for a configurable IC requires debugging tools to help track errors in the design. Such debugging tools generally have software components and circuitry components. In some earlier configurable ICs, the debugging circuitry was integrated into the main body of the integrated circuit. In some cases, the debugging circuitry was implemented using the basic configurable circuits. In other cases, the debugging circuitry was fixed function circuitry that was to be used for debugging purposes only, but which was physically located among the configurable circuits. However, those implementations both had drawbacks. Implementing the debugging circuitry using the basic configurable circuits meant that the debugging circuitry occupied configurable circuits that could otherwise be used for implementing the user design on the IC. Implementing the debugging circuitry primarily as fixed function circuitry located among the configurable circuits meant that the debugging circuitry could not be readily redesigned. For instance, making the debugging circuitry larger would require redesigning the main configurable IC to move the configurable circuits out of the way of the larger debugging circuitry.
Therefore, there is a need in the art for debugging circuits positioned outside of the ordinary configurable circuits of configurable ICs. Ideally, the mechanism for loading configuration data could also be used to carry data to circuits used to monitor and debug the configurable IC, with some support within individual logic blocks for routing signals onto and off of the configuration/debug network.